package cn.tedu.reflection;/**
 * @Author 金帮嘉诚 @Date 2021-06-29 星期二 10:09
 */
/*本类用于测试暴力反射*/

import org.junit.Test;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**知识点
 * 获取私有属性和成员方法并调用
 * 特别注意一些方法的参数
 *
 *
 *
 * */
public class TestReflect2 {
    @Test
    public void getReflect() throws NoSuchFieldException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
        Class<?> clazz = Person.class;

        //创建对象
        Constructor<?> c1 = clazz.getDeclaredConstructor(String.class,int.class);
        c1.setAccessible(true);
        Object o1 = c1.newInstance("o1",18);
        Object o2 = c1.newInstance("o2",18);

        Object o3 = c1.newInstance("o3",18);

        Person p3=(Person)o3;
        System.out.println(p3);


        //注意此处 方法括号内 属性的名称 要加引号
        //此处抛出异常NoSuchFieldException
        Field field1 = clazz.getDeclaredField("name");
        field1.setAccessible(true);
        System.out.println(field1.getType());
        System.out.println(field1.getName());

//        Object o1=clazz.newInstance();
        field1.set(o1,"???");
        //此方法 获取o1对象的name属性值
        System.out.println(field1.get(o1));

        Field field2=clazz.getDeclaredField("age");
//        Object o2=clazz.newInstance();

        //每个属性 分别设置是否可用 都要设置
        field2.setAccessible(true);
        field2.set(o2,2);
        field2.set(o1,3);

        //方法
        //NoSuchMethodException
        Method add = clazz.getDeclaredMethod("add", String.class, int.class);
        add.setAccessible(true);
        //InvocationTargetException
        add.invoke(o2,"???",1);

    }
}
